package fr.alma.domo.model;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Definition d'un schema de collaboration entre plusieurs 
 * services
 * 
 * @author steg
 *
 */
public interface CollaborationSchema {
	
	/**
	 * Utilisé pour injecter les services à 
	 * l' instanciation du schéma
	 * @author steg
	 *
	 */
	@Target(ElementType.FIELD)
	@Retention(RetentionPolicy.RUNTIME)
	public static @interface Service{
		/**
		 * Le nom du service, ce nom sera utiliser en autre
		 * pour récupérer sa description dans {@code fr.alma.domo.model.CollaborationSchema#descriptions()}
		 * @return
		 */
		String name();
	}
	
	public abstract Description getDescriptionFor(String name);
	
	/**
	 * Cette méthode est appelé lors de l'instanciation
	 * du schema de collaboration lorsque tous les services 
	 * lui ont été injecté
	 * 
	 */
	public abstract void negociate();
	
	/**
	 * 
	 * Cette méthode est appelé lorsque le gestionnaire d' adaptation
	 * à remplacer un ou plusieurs services qui ne correspondaient plus 
	 * aux contraintes spécifier la construction du schema
	 * 
	 */
	public abstract void renegociate();
	
}
